import logging
import allure
from functools import wraps


def step_logger(func):
    """
    装饰器：自动添加Allure步骤和日志记录
    要求被装饰的函数接收step参数，且step包含"step_num"和"step_name"键
    """

    @wraps(func)
    def wrapper(*args, **kwargs):
        # 从参数中获取step对象（支持位置参数或关键字参数）
        step = None
        for arg in args:
            if isinstance(arg, dict) and "step_num" in arg and "step_name" in arg:
                step = arg
                break
        if step is None:
            step = kwargs.get("step")

        if step:
            step_num = step["step_num"]
            step_name = step["step_name"]
            # 记录日志
            logging.info(f'第{step_num}步：{step_name}')
            # 用Allure记录步骤
            with allure.step(f'第{step_num}步：{step_name}'):
                return func(*args, **kwargs)
        else:
            # 如果没有找到step参数，直接执行函数
            return func(*args, **kwargs)

    return wrapper